利用 AWS Session Manager 访问 VPC 内网的资源

缘起

因为数据库放 VPC 私网网段里了,然后研发有各种直连数据库的需求,其实也有 VPN 方案,但有的研发认为先拨 VPN 不太方便,而我正好认识到 ssm,觉得挺有意思,所以就有了这篇文章的出炉。

其实实际上,都有了 EC2 了,直接上面建账号,几乎所有的 MySQL 的 GUI 客户端,都支持 ssh tunnel 来连数据库,这样就不需要手工命令自己打洞了,MySQL 的 GUI 客户端就一起给你搞定了,这部分还会再水一篇文章。可是,真的值得吗?后话再说。但 ssm plugin 方案比 ssh tunnel 方案更牛逼的一点是:ssm plugin 方案里,EC2 不需要有公网地址!

本地安装 aws-cli 和 Session Manager plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 我的本地环境是 Macbook Air (m1),
# 其他环境可能命令不一样
curl \
"https://awscli.amazonaws.com/AWSCLIV2.pkg" \
-o "AWSCLIV2.pkg"
sudo installer \
-pkg AWSCLIV2.pkg \
-target /
# 以上命令是安装 aws-cli。
# 然后当然还需要配置 aws --configure
# 或 aws --profile xxx --configure
curl \
"https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac_arm64/session-manager-plugin.pkg" \
-o "session-manager-plugin.pkg"
sudo installer \
-pkg session-manager-plugin.pkg \
-target /
sudo ln \
-s /usr/local/sessionmanagerplugin/bin/session-manager-plugin \
/usr/local/bin/session-manager-plugin

如果是Windows环境,可从以下网址下载session-manager-plugin并安装

https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe

具体使用

场景一:登录服务器

1
2
3
4
aws \
--profile VFans-test \
ssm start-session \
--target i-0xxxxxxxxxxxxxx7

最后成功后显示:

Note: 这种“登录” EC2 服务器跟 ssh 登录 EC2 服务器相比,缺点就是不能上传下载数据。

场景二:打洞到 RDS

1
2
3
4
5
6
aws \
--profile VFans-test \
ssm start-session \
--target i-0xxxxxxxxxxxxxxx7 \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters host="192.168.xxx.xxx",portNumber="3306",localPortNumber="5555"

成功后显示:

这时候,再开一个控制台,测试如下:

发现本地的 5555 端口是开着的,如果用 MySQL 客户端来连的话,会发现连上的正好是 MySQL。